/*
 * @Copyright    : Blueray Med .ltd
 * @file name    : Filename
 * @Date         : 2022-10-19 16:03:50
 * @LastEditor   : Liam
 * @Description  : 按键按下后的处理函数
 */
#include "btn_handler.h"
#include "myQueue.h"

/**
 * @Function: page_to_page_handler_function
 * @Description: 处理页面跳转的函数，含有准备与待机切换的函数。
 * @Author: Liam
 * @Input: pagenum_now_val传入现在的页面数字；pagenum_btn_val传入需要跳转的页面数字。
 * @Return: null
 * @Others: note
 * @result: Success
 */
void page_to_page_handler_function(u16 pagenum_now_val, u16 pagenum_btn_val)
{
    switch (pagenum_now_val)
    {
    // case PIC_NUM_MAIN:/* 判断当前在哪一个模式 点击进入该模式 */
    //     if (pagenum_btn_val == PIC_NUM_BLACK)
    //     {
    //         select_mode_enter(sysSt.surgical_mode);
    //     }
    //     break;
    case PIC_NUM_MINIAO:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_GONGQIANG)
        {
            send_endoscope_mode(GONGQIANG_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_GONGQIANG:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_FUQIANG)
        {
            send_endoscope_mode(FUQIANG_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_FUQIANG:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_ZIDINGYI)
        {
            send_endoscope_mode(ZIDINGYI_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_YINGGUANG1:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_YINGGUANG2)
        {
            send_endoscope_mode(YINGGUANG2_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_YINGGUANG2:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_YINGGUANGZDY)
        {
            send_endoscope_mode(ZIDINGYI_YINGGUANG_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_ZIDINGYI:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_YINGGUANG1)
        {
            send_endoscope_mode(YINGGUANG1_MODE);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_YINGGUANGZDY: /* 荧光自定义 */
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
            /* 发送保存自定义参数标志位 */
        }
        else if (pagenum_btn_val == PIC_NUM_MINIAO)
        {
            send_endoscope_mode(MINIAO_MODE);
            // pic_set(PIC_NUM_MINIAO);
            // write_VP_check(PAGE_BTN_NUM, CLEAR);
        }
        else if (pagenum_btn_val == PIC_NUM_SYSTEM) /* 进入系统界面 */
        {
            pic_set(PIC_NUM_SYSTEM);
        }
        break;
    case PIC_NUM_SYSTEM:
        if (pagenum_btn_val == PIC_NUM_MAIN)
        {
            pic_set(PIC_NUM_MAIN);
        }
        else if (pagenum_btn_val == PIC_NUM_PASSWORD0)
        {
            enter_set(); /* 进入后台前处理函数 */
            pic_set(PIC_NUM_PASSWORD0);
        }
        // else if (pagenum_btn_val == PIC_NUM_BLACK) 
        // {
        //     select_mode_enter(sysSt.surgical_mode);
        // }
        break;
    case PIC_NUM_PROJECT:
        if (pagenum_btn_val == PIC_NUM_SYSTEM)
        {
            exit_set(); /* 退出后台 */
        }
        else if (pagenum_btn_val == PIC_NUM_BLACK) /* 更新数据 */
        {
            my_queue_enqueue(PROTOCOL_WRITE, MINIAO_SET_VALUE, 112, PTR_NUM_1); /* 保存参数 */
            write_VP_check(PAGE_BTN_NUM, OPEN);
        }
        else if (pagenum_btn_val == PIC_NUM_PROJECT_BTN)
        {
            pic_set(PIC_NUM_PROJECT_BTN);
        }
        break;
    case PIC_NUM_PROJECT_BTN:
        if (pagenum_btn_val == PIC_NUM_PROJECT)
        {
            pic_set(PIC_NUM_PROJECT);
        }
        break;

    default:
        break;
    }
}

/**
 * @Function: select_mode_enter
 * @Description: 选择进入哪一个模式界面，仅在模式之间切换。每90ms调用一次，
 * @Author: Liam
 * @Input: mode_val内窥镜模式 pagenum_val当前界面页码
 * @Return: null
 * @Others: note
 * @result: Success
 */
void select_mode_enter(u16 mode_val, u16 pagenum_val)
{
    if ((pagenum_val >= PIC_NUM_ZIDINGYI && pagenum_val <= PIC_NUM_YINGGUANGZDY) || pagenum_val == PIC_NUM_MINIAO) /* 判断是否在内窥镜模式界面 */
    {
        mode_page_set(mode_val);
    }
    else if (pagenum_val == PIC_NUM_MAIN || pagenum_val == PIC_NUM_SYSTEM) /* 在主页和系统界面 */
    {
        if (sysSt.pagenum_btn_val == PIC_NUM_BLACK) /* 按键点击 */
        {
            mode_page_set(mode_val);
        }
    }
    else
    {
        return;
    }
}

/**
 * @Function: mode_page_set
 * @Description: 选择进入哪一个模式界面
 * @Author: Liam
 * @Input:
 * @Return: null
 * @Others: note
 * @result: Success
 */
void mode_page_set(u16 mode_val)
{
    switch (mode_val) /* 判断在哪一个模式 */
    {
    case MINIAO_MODE:
        pic_set(PIC_NUM_MINIAO);
        break;
    case GONGQIANG_MODE:
        pic_set(PIC_NUM_GONGQIANG);
        break;
    case FUQIANG_MODE:
        pic_set(PIC_NUM_FUQIANG);
        break;
    case YINGGUANG1_MODE:
        pic_set(PIC_NUM_YINGGUANG1);
        break;
    case YINGGUANG2_MODE:
        pic_set(PIC_NUM_YINGGUANG2);
        break;
    case ZIDINGYI_MODE:
        pic_set(PIC_NUM_ZIDINGYI);
        break;
    case ZIDINGYI_YINGGUANG_MODE:
        pic_set(PIC_NUM_YINGGUANGZDY);
        break;

    default:
        break;
    }
}

/**
 * @Function: enter_set
 * @Description: 进入标定界面
 * @Author: Liam
 * @Input:
 * @Return: null
 * @Others: note
 * @result: Success
 */
void enter_set(void)
{
    my_queue_enqueue(PROTOCOL_READ, MINIAO_SET_VALUE, 112, PTR_NUM_1); /* 读取参数 */
}

/**
 * @Function: exit_set
 * @Description: 退出标定界面
 * @Author: Liam
 * @Input:
 * @Return: null
 * @Others: note  
 * @result: Success
 */
void exit_set(void)
{
    nor_flash_rw_cmd(NOR_FLASH_W, 0x00000002, LANGUAGE_MODE, 0x0008); /* 保存型号 */
    pic_set(PIC_NUM_SYSTEM);
}

/**
 * @Function: send_function
 * @Description: 发送首页功能的值
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_function(void)
{
    u16 btn_val_1000;
    u16 last_btn_val_1000;
    sys_read_vp(MAIN_PAGE_BTN, (u8 *)&btn_val_1000, 1);
    if (btn_val_1000 != last_btn_val_1000)
    {
        last_btn_val_1000 = btn_val_1000;
        write_VP_check(FUNCTION_MODE, btn_val_1000);
        if (btn_val_1000 != 0)
        {
            my_queue_init();
            write_VP_check(CODE_SOURCE, LED_DEVICE);
            my_queue_enqueue(PROTOCOL_WRITE, CODE_SOURCE, 1, FUNCTION_MODE, 1, PTR_NUM_2); /* 参数 */
        }
        write_VP_check(MAIN_PAGE_BTN, 0);
    }
}

/**
 * @Function: send_pressure_flow_handler
 * @Description: 发送改变的值
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_pressure_flow_handler(void)
{
    u8 i;
    static u16 last_data[7][6] = {0}; 
    /* 0 for 16ZIDINGYI, 
       1 for 21YINGGUANGZDY 
       2 for 3MINIAO 
       3 for 17gongqiang,
       4 for 18fuqiang,
       5 for 19yingguang1,
       6 for 20yingguang2 */
    u16 current_data[6] = {0};
    u16 *data_ptr;
    u16 base_address;
    u16 page_index;

    if (sysSt.pagenum_now_val == PIC_NUM_ZIDINGYI)
    {
        data_ptr = current_data;
        base_address = ZIDINGYI_SET_VALUE;
        page_index = 0;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_YINGGUANGZDY)
    {
        data_ptr = current_data;
        base_address = YINGGUANGZDY_SET_VALUE;
        page_index = 1;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_MINIAO)
    {
        data_ptr = current_data;
        base_address = MINIAO_SET_VALUE;
        page_index = 2;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_GONGQIANG)
    {
        data_ptr = current_data;
        base_address = GONGQIANG_SET_VALUE;
        page_index = 3;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_FUQIANG)
    {
        data_ptr = current_data;
        base_address = FUQIANG_SET_VALUE;
        page_index = 4;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_YINGGUANG1)
    {
        data_ptr = current_data;
        base_address = YINGGUANG1_SET_VALUE;
        page_index = 5;
    }
    else if (sysSt.pagenum_now_val == PIC_NUM_YINGGUANG2)
    {
        data_ptr = current_data;
        base_address = YINGGUANG2_SET_VALUE;
        page_index = 6;
    }
    else
    {
        return; /* 无效页面，直接返回 */
    }

    for (i = 0; i < 6; i++)
    {
        sys_read_vp(base_address + i, (u8 *)&data_ptr[i], 1);
    }

    if (memcmp(data_ptr, last_data[page_index], sizeof(current_data)) != 0)
    {
        memcpy(last_data[page_index], data_ptr, sizeof(current_data));
        write_VP_check(CODE_SOURCE, LED_DEVICE);
        my_queue_enqueue(PROTOCOL_WRITE, CODE_SOURCE, 1, base_address, 6, PTR_NUM_2); /* 自定义参数 */
    }
}

/**
 * @Function: send_endoscope_mode
 * @Description: 发送内窥镜模式
 * @Author: Liam
 * @Input: mode 模式0-6
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_endoscope_mode(u16 mode)
{
    write_VP_check(ENDOSCOPE_MODE, mode);
    write_VP_check(CODE_SOURCE, LED_DEVICE);
    my_queue_enqueue(PROTOCOL_WRITE, CODE_SOURCE, 1, ENDOSCOPE_MODE, 1, PTR_NUM_2); /* 内窥镜模式参数 */
    write_VP_check(PAGE_BTN_NUM, CLEAR);                                            /* 清空按键参数 */
}

/**
 * @Function: send_btn_board_function
 * @Description: 后台更改参数按键值参数
 * @Author: Liam
 * @Input: 
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_btn_board_function(u16 page_num)
{
    if (page_num == PIC_NUM_PROJECT_BTN)
    {
        u16 btn_val;
        sys_read_vp(PROJECT_BTN_VAL, (u8 *)&btn_val, 1);
        if (btn_val != CLOSE) /* 按键值不等于0 */
        {
            write_VP_check(SEND_PROJECT_BTN_VAL, btn_val);
            my_queue_enqueue(PROTOCOL_WRITE, SEND_PROJECT_BTN_VAL, 1, PTR_NUM_1); /* 发送按键值参数 */
            write_VP_check(PROJECT_BTN_VAL, CLOSE);                               /* 清空按键值参数 */
        }
    }
}

/**
 * @Function: send_main_endoscope_mode    
 * @Description: 主页发送内窥镜模式
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_main_endoscope_mode(u16 page_num,u16 source)
{
    if (page_num == PIC_NUM_MAIN)
    {
        u16 mode;
        u16 last_mode;
        u8 hand_status; 
        sys_read_vp(ENDOSCOPE_MODE, (u8 *)&mode, 1);
        if (mode != last_mode)
        {
            last_mode = mode;
            write_VP_check(ENDOSCOPE_MODE, mode);
            if (source != HANDLE_DEVICE) /* 不是手柄设备才发送 */
            {
                write_VP_check(CODE_SOURCE, LED_DEVICE);
                my_queue_enqueue(PROTOCOL_WRITE, CODE_SOURCE, 1, ENDOSCOPE_MODE, 1, PTR_NUM_2); /* 发送内窥镜模式参数 */
            }
            else if (source == HANDLE_DEVICE) /* 手柄已经发过数据 */
            {
                sys_read_vp(HAND_ENABLE, (u8 *)&hand_status, 1); /* 读屏幕触控的状态 */
                if (hand_status == 1 || 3)                       /* 开启发送 */
                {
                    write_VP_check(CODE_SOURCE, LED_DEVICE);
                }
            }
        }
    }
}

/**
 * @Function: send_reset_btn    
 * @Description: 系统重置按键
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void send_reset_btn(void)
{
    u16 btn_val;
    sys_read_vp(RESET_BTN_VAL, (u8 *)&btn_val, 1);
    if (btn_val == OPEN) /* 按键值不等于0 */
    {
        write_VP_check(SEND_RESET, OPEN);
        my_queue_enqueue(PROTOCOL_WRITE, SEND_RESET, 1, PTR_NUM_1); /* 发送按键值参数 */
        write_VP_check(RESET_BTN_VAL, CLEAR);
    }
}

/**
 * @Function: the_gui_system_init
 * @Description: 系统开机初始化的默认参数写入
 * @Author: Liam
 * @Input: null
 * @Return: null
 * @Others: note
 * @result: Success
 */
void the_gui_system_init(void)
{
    sysSt.open_time = 0;
    sys_the_sound(OPEN);
    write_VP_check(0x9000, OPEN);
    write_VP_check(PAGE_BTN_NUM, CLEAR);
    write_VP_check(ENDOSCOPE_MODE, MINIAO_MODE);
    /* 语言设置 */
    the_language_enable();
    pic_set(PIC_NUM_OPEN);
    /* 设置代码来源 */
}
